package study.thread.collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/*
 * copy-on-write: 对于新的 CopyOnWriteArrayList 和 CopyOnWriteArraySet类，所有可变的（mutable）操作都首先取得后台数组
 * 的副本，对副本进行更改，然后替换副本。这种做法保证了在遍历自身可更改的集合时，永远不会抛出ConcurrentModificationException。
 * 遍历集合会用原来的集合完成，而在以后的操作中使用更新后的集合。 
 * 
 * 
 */
public class CopyOnWriteDemo {
	public static void main(String arg[]) {
		
		String ss[] = {"aa","bb","cc"};
		
		List<String> list1 = new CopyOnWriteArrayList<String>(Arrays.asList(ss));
		List<String> list2 = new ArrayList<String>(Arrays.asList(ss));
		
		Iterator<String> iterator1 = list1.iterator();
		Iterator<String> iterator2 = list2.iterator();
		
		// 俩个都添加一个新元素
		list1.add("New");
		list2.add("New");
		
		printAll(iterator1);
		

		try {
			printAll(iterator2);
		} catch (ConcurrentModificationException e) {
			//System.out.println("\n");
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}
	
	private static void printAll(Iterator it) {
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
}
